[小ネタ]ECS ExecのenableExecuteCommandを有効にしようとするとエラーになってしまう
こんにちは!コンサル部のinomaso(@inomasosan)です。
弊社の以下ブログを参考にECS Execの設定をしていたところ、ECSサービスのenableExecuteCommand
有効にする設定でエラーとなりハマってしまいました。
今回はエラー原因と解決方法をまとめていきます。
まずは結論
ECSタスクロールのSSMセッションマネージャー関連の権限不足が原因でした。
環境
今回実行した環境は以下の通りです。
- macOS Big Sur 11.6
- AWS CLI 2.2.35
- Fargateプラットフォーム 1.4.0
エラー事象
ECSサービスのenableExecuteCommand
有効にするため、以下のコマンドを実行しました。
$ aws ecs update-service \ --cluster [クラスター名] \ --service [サービスー名] \ --enable-execute-command
すると、以下のようなエラーメッセージが返ってきました。
An error occurred (InvalidParameterException) when calling the UpdateService operation: The service couldn't be updated because a valid taskRoleArn is not being used. Specify a valid task role in your task definition and try again.
原因
以下のSSMセッションマネージャ用IAMポリシーを作成したのですが、アタッチ先をECSタスク実行ロールにしたのが原因です。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource": "*" } ] }
最初の結論で記載した通り、上記IAMポリシーはECSタスクロールにアタッチしなくてはなりません。
ロールの違いについて
ECSのタスク実行ロールとタスクロールは別物です。
タスク実行ロールはECSコンテナエージェントがECRからのコンテナイメージプルや、コンテナログをCloudWatchに送信するためIAMポリシーが必要となります。
AWSマネージメントコンソールから作成した場合は、以下のデフォルトIAMポリシーが作成されます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*" } ] }
一方タスクロールはコンテナが他のAWSサービスと連携する際にのみ、必要なIAMポリシーを設定します。
詳細については、Toriさんの以下ツイートがわかりやすかったです。
ECS と IAM の話です
1. Task role
アプリに IAM 権限が必要なときに設定するもの (例: アプリから S3 触りたい、DDB 触りたい)
2. Task "execution" role
ECS Agent のようなコンテナ実行環境のエージェントが必要とする IAM 権限を設定するもの (例: ECR からイメージ pull、CWLogs にログ送る) pic.twitter.com/QZs8AG974i
— Tori Hara (@toricls) August 19, 2021
ところで何でこんなミスしたの
ECSのIAMロールの違いがよくわかっておらず、タスク実行ロールに必要なIAMポリシーがアタッチされてればイケるかなーと思ったら見事にハマりました…
横着は良く無いですね。
まとめ
Toriさんの解説ツイートは以前にも見たことがあったのですが、実際に利用する(ハマる)ことでちゃんと理解できました。
やはり実際に手を動かすことは大事です。
この記事が、どなたかのお役に立てば幸いです。それでは!